欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【6.824】Lecture2-RPC And Threads--远程调用与线程

程序员文章站 2022-07-12 17:02:12
...

1.杂项

推荐书《effective go》
实际上本节课没有说到RPC



每一个线程有属于自己的程序计数器,一套寄存器和栈.


我们在分布式系统中关注多线程的原因:
(1)I/O concurrency                                 --I/O并发
(2)achive parallelism  via a multi-core machine    --利用多核机器实现并行
(3)convenience                                     --易用性



易用性怎么理解?
有时候我们想在后台做一些事,比如说周期性的执行一件事,但是你又不愿意去用主线程插入一些检查,
比如说我想要做的那个事情每秒钟都发生一次,此时我们就可以用线程来做这个.
应用举例:
比如说一个master服务器需要周期性的检查它的worker进程是否一直存活,
因为这些worker服务器之一宕机的话,就需要把工作扔到另一台机器上去执行,
就像MapReduce那样,你可以每隔一分钟或者每隔一秒钟通过发送一条“Are you alive”
这样的消息到worker服务器上,你可以启动一个goroutine,然后执行一个死循环,sleep 1秒
后,然后做需要周期执行的动作,然后再sleep 1秒.虽然这会有一些开销,但是它是值得的.


【12:39】
asychrinous program = event-driving programming?


【实践:编写一个事件驱动程序】新开一个线程while(1)啊!读那个链表,一旦就绪链表里有内容,
就去处理啊!!豁然开朗~~不一定非要定时多长时间!一直在while(1)会耗费很多资源吗?

事件驱动编程的一般结构是,通常它有一个线程,同时它有一个循环,这个循环等待输入或者其他的
任何事件,这些事件能够触发程序继续运行,事件可能是来自客户端的请求,可能是定时器到期,如果
你在编写一个windows系统程序,我们电脑上的很多windows程序都是通过事件驱动的风格来编写的,
它们等待的事情像是键盘的敲击或者鼠标的移动,所以你可能有一个单一的只有一个控制线程的程序,
这个线程有一个循环一直等待输入,无论何时输入进来,比如收到报文,它都能够找出来是哪个客户端
发送的这个报文,它有一张表格,记录这个客户端到底处于什么样的活动状态.
使用线程会变得更加方便,因为线程更容易使得程序写的连贯有序,就一溜写下来几行代码,计算,
然后发送消息,然后等待响应,这笔在只有一个线程里吧一个活动分割成一块一块的办法容易多了.
在事件驱动循环里面,你一次只能执行一个活动.这种编程模式的问题在于它实现起来有些痛苦,
另一个潜在的问题是,当你通过这种方法获取IO并发以后,你就没有办法利用CPU的并行化机制,
你就没有办法利用CPU的并行化机制,所以当你写一个负载很高的服务,你得想方设法把一台大型
机的32核都用上,使用一个单一的循环的话,它不能充分地利用多核,另一方面,冒这样的风险去
编程通常换来的性能提升相比于多线程来说并不会太多,而且线程相对来说也很廉价,每一个线程
都有一个栈,栈通常是1KB或者几千字节.如果你有20个线程,这些消耗并不用在意,但是如果你有100w
个线程,那就会消耗大量的内存,那他就会消耗大量的内存,另外,线程调度是指下一步应该选择
哪个线程运行,通常有一个调度列表,上面记录了1000个线程,这时候切换线程指向将付出相当
昂贵的代价,所以当你只有一个服务器的时候,你的服务器腰围100w个客户端提供服务,你需要为
这100w个客户端记录一些状态,这个代价还挺高的.(老师,这里100w个线程能创建起来吗?)
如果这里使用时间驱动编程.

如果电脑有8个核心,每个核心上都运行一个精简的事件驱动循环,一个循环一个核.对于IO来说,
这是一种获得并行化的方式.

Go语言中的channel底层是什么实现?

学生问:上下文切换时,是所有线程都在切换吗?
老师答:假设一个操作系统上只有两个进程,操作系统把CPU时间片反复地分配给这两个程序,
        当硬件时钟到期时,操作系统就判断实收把CPU从正在运行的进程中剥夺,然后把CPU分配给
        另一个进程.这件事情实在进程级别上做的.
       (老师这里说的意思是CPU的调度单位是CPU的意思吗?如果进程A有2个线程A1,A2,进程B有三
个线程B1,B2,B3,一共10秒钟,在这5个线程都有超过两秒的任务切没有主动休眠的情况下,各自能享
受多久的时间片?)
【19:57】
需要做一下实验看看.
https://www.zhihu.com/question/29679344--知乎,真假难辨.


一些关键词:
1.race
2.cordination:
  (1)channel,
  (2)sysn.cond(condition varibales)
  (3)waitgroup
3.DeadLock



代码路径:
https://pdos.csail.mit.edu/6.824/notes/crawler.go