欢迎光临散文网 会员登陆 & 注册

云晶Cloud:解说已有的操作系统(三)

2023-06-28 15:34 作者:云晶Cloud  | 我要投稿

04  操作系统中与编程有关的基本知识


进程线程的基本概念

  • 并发和隔离。

  • 程序执行的上下文(Context of Execution)

  • 执行与调度的基本单位:thread

  • 资源所有权:process

  • 进程是资源的容器,包含(一个或)多个线程。内核调度的基本单位是线程(不完全是)、而非进程。

  • 同一进程下的各个线程共享资源(address space、open files、signal handlers,etc),但寄存器、栈、PC指针等不共享。

进程和线程到底有什么区别?

以上其实已经说了一部分,线程是调度和执行的基本单位,最终代码都在线程中执行。而进程是资源的容器,包括一个或多个线程。同一个进程下的各个线程共享资源。

如下图为区别:


Linux的线程进程概念

Linux的线程是用户级别的,也就是内核中不存在线程。

  • 所有的线程管理都在应用层去执行。

  • 内核不关心,实际上也觉察不到线程的存在。

Windows的线程进程概念


而从上图也可以看出,Windows和Linux显然采用不同的理念。

windows的线程是内核级别的。

  • Windows是这些概念的一个例子。

  • 内核维护着线程和进程的上下文。

  • 调度实际上是基于线程而运行的。

05  进程间的通信

有了线程,进程的隔离,就需要线程进程之间的通信机制来保证协作完成任务,共享访问数据。

Windows进程间的通信

  • 文件映射

  • 共享内存

  • 匿名管道(单项,一端写,一端读)

  • 命名管道。

  • 动态链接库

  • 远程过程调用(可以在一台机器内,也可以跨机器)

  • UDS(Unix Domain Socket)

  • 基于Windows的消息机制 ……

Linux进程间的通信

  • 管道(Pipe),以及有名管道

  • 信号(Signal)

  • 报文(Message)队列(消息队列)

  • 共享内存(效率最高)

  • 信号量(Semaphore)

  • 主要作用是进程间,以及同一进程的不同线程之间的同步手段(UDS)Socket套接字

以上Window和Linux虽然采用了不同的方式,概念上有所不同的方式进行进程间的通信,实际上,他们的基本原理类似。

06  线程间的通信

  • 共享数据结构。共享内存

  • 事件(Event)传递

  • 消息队列

  • 邮箱(ucosII)

07  线程同步

线程同步,即当有一个线程在对内存或者外设进行操作时,其他线程都不可以对这个内存地址或者外设进行操作,直到该线程完成操作,其他线程才可以进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多,如下。

  • 一般使用信号量(Semaphore)。

  • 高级语言如java本身语言的设计就为此考虑,如synchronized关键字,wait,notify方法。

  • 可以使用Mutex。

  • 临界区对象。

08  信号量与互斥锁

Semaphore(信号量,或者信号灯)

以一个停车场的运作为例。简单起见,假设停车场只有三个车位,一开始三个车位都是空的。

如果同时来了五辆车,看门人允许其中三辆直接进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。

这时,有一辆车离开停车场,看门人得知后,打开车栏,放入外面的一辆进去,如果又离开两辆,则又可以放入两辆,如此往复。

在微观世界里,计算机世界里,比如访问硬盘空间,读取数据,往往资源有限。可以可以使用该机制,进行有效的对资源的访问进行协调控制。

Mutex(互斥锁)

一次只能有一个线程进入的特殊信号量。性能会比信号量好。对于某些特殊的应用场景,一次只能有一个线程访问,待该线程退出后,其他线程方可继续运行。例如操作系统的IO外设,打印机,现实生活当中的公共卫生间等等。

云晶Cloud:解说已有的操作系统(三)的评论 (共 条)

分享到微博请遵守国家法律