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

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值