Skip to content

Commit

Permalink
thread rsrc/sync
Browse files Browse the repository at this point in the history
  • Loading branch information
wolverinn committed Dec 2, 2019
1 parent 0baffa3 commit d8a264c
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 5 deletions.
107 changes: 102 additions & 5 deletions Operating Systems.md
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
# 操作系统

### 进程和线程有什么区别?
- 进程(Process)是系统进行资源分配和调度的基本单位,线程(Thread)是程序执行的最小单位
- 进程(Process)是系统进行资源分配和调度的基本单位,线程(Thread)是CPU调度和分派的基本单位
- 线程依赖于进程而存在,一个进程至少有一个线程;
- 进程有自己的独立地址空间,线程不拥有资源,而是共享所属进程的资源;因此CPU创建和切换线程的开销比进程小得多;
- 进程有自己的独立地址空间,线程共享所属进程的地址空间;
- 进程是拥有系统资源的一个独立单位,而线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),和其他线程共享本进程的相关资源如内存、I/O、cpu等;
- 在进程切换时,涉及到整个当前进程CPU环境的保存环境的设置以及新被调度运行的CPU环境的设置,而线程切换只需保存和设置少量的寄存器的内容,并不涉及存储器管理方面的操作,可见,进程切换的开销远大于线程切换的开销;
- 线程之间的通信更方便,同一进程下的线程共享全局变量等数据,而进程之间的通信需要以进程间通信(IPC)的方式进行;
- 多线程程序只要有一个线程崩溃,整个程序就崩溃了,但多进程程序中一个进程崩溃并不会对其它进程造成影响,因为进程有自己的独立地址空间,因此多进程更加健壮

Expand Down Expand Up @@ -33,7 +35,31 @@ else:
分析:fork函数分别在父进程和子进程中返回,在子进程返回的值pid永远是0,在父进程返回的是子进程的进程id(标识符)。
</details>

##### 同一进程中的线程可以共享哪些数据?
<details>
<summary>展开</summary>

- 进程代码段
- 进程的公有数据(全局变量、静态变量...)
- 进程打开的文件描述符
- 进程的当前目录
- 信号处理器/信号处理函数:对收到的信号的处理方式
- 进程ID与进程组ID
</details>

##### 线程独占哪些资源?
<details>
<summary>展开</summary>

- 线程ID
- 一组寄存器的值
- 线程自身的栈(堆是共享的)
- 错误返回码:线程可能会产生不同的错误返回码,一个线程的错误返回码不应该被其它线程修改;
- 信号掩码/信号屏蔽字(Signal mask):表示是否屏蔽/阻塞相应的信号(SIGKILL,SIGSTOP除外)
</details>

### 进程间通信有哪些方式?

1. 管道(Pipe)
<details>
<summary>展开</summary>
Expand All @@ -43,13 +69,84 @@ else:
- 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)
</details>

2. 命名管道(FIFO)
2. 命名管道
3. 消息队列
4. 信号(Signal)
5. 共享内存
6. 信号量(Semaphore)
6. 信号量(Semaphore):初始化操作、P操作、V操作;P操作:信号量-1,检测是否小于0,小于则进程进入阻塞状态;V操作:信号量+1,若小于等于0,则从队列中唤醒一个等待的进程进入就绪态

![https://blog.csdn.net/sweetyoyy/article/details/77926871](_v_images/20191202162008435_14938.png)

7. 套接字(Socket)

### 进程同步问题

> 进程的同步是目的,而进程间通信是实现进程同步的手段
<details>
<summary>管程</summary>


</details>

<details>
<summary>生产者-消费者问题</summary>


</details>

<details>
<summary>哲学家就餐问题</summary>


</details>

<details>
<summary>读者-写者问题</summary>


</details>

##### 临界区的概念?
<details>
<summary>展开</summary>

各个进程中对临界资源(互斥资源/共享变量,一次只能给一个进程使用)进行操作的程序片段
</details>

##### 同步与互斥的概念?
<details>
<summary>展开</summary>

- 同步:多个进程因为合作而使得进程的执行有一定的先后顺序。比如某个进程需要另一个进程提供的消息,获得消息之前进入阻塞态;
- 互斥:多个进程在同一时刻只有一个进程能进入临界区
</details>

### 进程有哪几种状态?

![Process State](_v_images/20191202090217863_1873.png)

- 就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源
- 运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数
- 阻塞状态: 进程等待某种条件,在条件满足之前无法执行

### 线程同步有哪些方式?

> 为什么需要线程同步:线程有时候会和其他线程共享一些资源,比如内存、数据库等。当多个线程同时读写同一份共享资源的时候,可能会发生冲突。因此需要线程的同步,多个线程按顺序访问资源。
- 互斥量 Mutex:互斥量是内核对象,只有拥有互斥对象的线程才有访问互斥资源的权限。因为互斥对象只有一个,所以可以保证互斥资源不会被多个线程同时访问;当前拥有互斥对象的线程处理完任务后必须将互斥对象交出,以便其他线程访问该资源;
- 信号量 Semaphore:信号量是内核对象,它允许同一时刻多个线程访问同一资源,但是需要控制同一时刻访问此资源的最大线程数量。信号量对象保存了最大资源计数和当前可用资源计数,每增加一个线程对共享资源的访问,当前可用资源计数就减1,只要当前可用资源计数大于0,就可以发出信号量信号,如果为0,则将线程放入一个队列中等待。线程处理完共享资源后,应在离开的同时通过```ReleaseSemaphore```函数将当前可用资源数加1。如果信号量的取值只能为0或1,那么信号量就成为了互斥量;
- 事件 Event:允许一个线程在处理完一个任务后,主动唤醒另外一个线程执行任务。事件分为手动重置事件和自动重置事件。手动重置事件被设置为激发状态后,会唤醒所有等待的线程,而且一直保持为激发状态,直到程序重新把它设置为未激发状态。自动重置事件被设置为激发状态后,会唤醒**一个**等待中的线程,然后自动恢复为未激发状态。
- 临界区 Critical Section:任意时刻只允许一个线程对临界资源进行访问。拥有临界区对象的线程可以访问该临界资源,其它试图访问该资源的线程将被挂起,直到临界区对象被释放。

##### 互斥量和临界区有什么区别?
<details>
<summary>展开</summary>

互斥量是可以命名的,可以用于不同进程之间的同步;而临界区只能用于同一进程中线程的同步。创建互斥量需要的资源更多,因此临界区的优势是速度快,节省资源。
</details>

### 参考
- [进程间通信IPC -- 简书](https://www.jianshu.com/p/c1015f5ffa74)
- [面试/笔试第二弹 —— 操作系统面试问题集锦 - CSDN博客](https://blog.csdn.net/justloveyou_/article/details/78304294)
- [面试/笔试第二弹 —— 操作系统面试问题集锦 - CSDN博客](https://blog.csdn.net/justloveyou_/article/details/78304294)
- [线程同步与并发 - - SegmentFault](https://segmentfault.com/a/1190000018970361)
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,6 @@
2. [操作系统](Operating%20Systems.md)
3. [数据库](Database.md)
4. [工具:Git/正则表达式/命令行](Git-ReExp-ComdLine.md)
5. 设计模式、RESTful

![1](_v_images/20191130211842900_27611.png)
Binary file added _v_images/20191202090217863_1873.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added _v_images/20191202162008435_14938.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit d8a264c

Please sign in to comment.