实战:用 C 语言实现操作系统

一直以来,我们学习线程切换与调度,都是通过阅读操作系统书籍或 Linux 源码甚至反汇编 Window 内核代码。无论怎样,这些东西都很抽象,学习起来十分困难。


另外,随着现代化编程语言逐渐流行,C++20 的正式发布,都离不开用户态线程这些基础知识。再比如 Golang 的 Goroutine,腾讯公司的开源的 libco,百度的 BRPC 中的 bhtread,如果想深刻理解它们,都需要扎实的基本功。


本次 Chat 会带你循序渐近的掌握下面的知识点:

  • 控制流切换原理

  • 上下文切换

  • 线程设计

  • 调度函数的封装与代码模块化

  • 线程的主动切换

  • 时间片轮转调度


本文实验环境:

  • ubuntu 16.04 32 位操作系统(读者请务必提前安装好);

  • 挑选一个你自己觉得好用的虚拟机软件,比如 VMWare;

  • 请把你的虚拟机环境配置成单核 CPU。


学习时间:大于 5 小时


为什么使用 32 位系统?因为方便初学者学习,能更快速的掌握原理。


640?wx_fmt=gif

图1 用户态线程运行示例


需要注意的是,上面的代码,并没有使用操作系统为我们提供的 pthread 系列函数,thread_create  thread_join 函数都是自己纯手工实现的。唯一使用操作系统的函数就是设置时钟,因此会有时钟信号产生,这一步是为了模拟时间片轮转算法而做的。


本场 Chat 作者——Allen()

百度高级研发工程师,CSDN 博客专家。目前从事智能交互式对话系统云端开发。负责过大流量、高并发等业务场景。 


扫码查看完整 Chat 原文

进入读者圈与作者深度交流

640640

640?wx_fmt=jpeg


本场 Chat 关键点总结:

  • 理解“栈切换”的本质

  • 掌握指令执行与栈的关系

  • 掌握上下文是如何切换的

  • 理解主动切换,知道主动切换可能会发生在哪些地方

  • 理解什么是时间片

  • 对于不主动让出 cpu 的线程,是如何切换到其它进程的


这一整篇文章里,我们完成了线程切换与线程调度的框架,在此基础上,我们还可以做更多有关线程的东西,比如线程的同步与互斥,还有更多的线程状态。理解了本文之后,更深入的学习对你来说已经不是难事了!

点击阅读原文订阅本场 Chat,开始实战操作系统!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
用vc编写操作系统,你也可以做的到 CCriticalSection csDocLock; //文件锁保证读写互斥 CCriticalSection csReadCount; //读者记数互斥 CCriticalSection csPreWriteLock;//写者优先锁 int g_iReadCount = 0; bool g_bPreWriter= false; //写者优先标志 HANDLE hReadSemaphore=CreateSemaphore(NULL,3,3,"Semaphore1.object");//读者信号量 共允许3个读者同时进行 //线程体 bool who[3]={false}; DWORD WINAPI ReaderThreadFun(PVOID param) { CReader_WriterDlg * pWnd=(CReader_WriterDlg *)param; int iStep = 0; //申请信号量 if(g_bPreWriter)//写者优先锁 csPreWriteLock.Lock(); csReadCount.Lock(); g_iReadCount++; if(g_iReadCount==1) csDocLock.Lock();//锁定文件,保证不能写 csReadCount.Unlock(); ::WaitForSingleObject(hReadSemaphore,-1); if(g_bPreWriter)//写者优先锁 csPreWriteLock.Unlock(); //此处换算当前线程与对话框的哪个ProgressBAR控件关联 DWORD id; //要求4个读者进度条控件的ID顺序排列 int cur; //who[4]的元素与4个控件一一对应,某个下标对应的元素为true //,表示对应的进度条正在模拟中,模拟完成后,将其 //恢复为false,允许别的读者线程"占用"对应的控件,进行 //模拟 for(cur=0;cur<3;cur++) { if(!who[cur]) //找到第一个为false的下标cur { who[cur]=true; //一旦找到,将其置为true id=IDC_PROGRESS2+cur; //得到对应的进度条控件ID号 break; } } //模拟读者 while(iStep<10) { for(int i=0;i<10000;i++) { for(int j=0;j<1000;j++) ;//虚动作 } pWnd->SendMessage(WM_MSG_READER,(DWORD)iStep,id); iStep++; } //释放信号量 who[cur]=false; ::ReleaseSemaphore(hReadSemaphore,1,NULL); //判断是否所有读者均读完 csReadCount.Lock(); g_iReadCount--; if(g_iReadCount==0) { csDocLock.Unlock(); } csReadCount.Unlock(); return 0; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值