{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": { "dotnet_interactive": { "language": "csharp" }, "polyglot_notebook": { "kernelName": "csharp" } }, "source": [ "抢占模式与合作模式\n", "==============================" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "dotnet_interactive": { "language": "csharp" }, "polyglot_notebook": { "kernelName": "csharp" } }, "source": [ ".Net中,托管线程分为抢占模式和合作模式;区分这两种模式,主要是为了GC的实现。 \n", "\n", "处于合作模式的线程可以自由地访问托管堆上的对象;处理抢占模式的线程则不能访问托管堆上的对象,如果需要访问则必须等待GC结束并切换到合作模式。因为托管代码随时需要访问托管堆,所以托管代码必须在合作模式下运行,而非托管代码则没有这个限制。进入抢占模式后,托管代码暂停执行而非托管代码可以继续做与.Net对象无关的处理。 \n", "\n", "模式切换分为主动切换和被动切换" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": { "dotnet_interactive": { "language": "csharp" }, "polyglot_notebook": { "kernelName": "csharp" } }, "source": [ "GC安全点" ] } ], "metadata": { "kernelspec": { "display_name": ".NET (C#)", "language": "C#", "name": ".net-csharp" }, "polyglot_notebook": { "kernelInfo": { "defaultKernelName": "csharp", "items": [ { "aliases": [ "c#", "C#" ], "languageName": "C#", "name": "csharp" }, { "aliases": [ "frontend" ], "languageName": null, "name": "vscode" }, { "aliases": [ "powershell" ], "languageName": "PowerShell", "name": "pwsh" }, { "aliases": [], "languageName": null, "name": ".NET" }, { "aliases": [ "f#", "F#" ], "languageName": "F#", "name": "fsharp" }, { "aliases": [], "languageName": "HTML", "name": "html" }, { "aliases": [], "languageName": "KQL", "name": "kql" }, { "aliases": [], "languageName": "Mermaid", "name": "mermaid" }, { "aliases": [], "languageName": "SQL", "name": "sql" }, { "aliases": [], "languageName": null, "name": "value" }, { "aliases": [ "js" ], "languageName": "JavaScript", "name": "javascript" }, { "aliases": [], "name": "webview" }, { "aliases": [], "languageName": "T-SQL", "name": "sql-Demo" } ] } } }, "nbformat": 4, "nbformat_minor": 2 }