Go p struct


P는 Processor, 프로세서를 뜻함
정확히 말해서 P는 스케쥴링에 대한 context를 지니고 있다
```typetype p struct {	lock mutex	id          int32	status      uint32 // one of pidle/prunning/...	link        puintptr	schedtick   uint32     // incremented on every scheduler call	syscalltick uint32     // incremented on every system call	sysmontick  sysmontick // last tick observed by sysmon	m           muintptr   // back-link to associated m (nil if idle)	mcache      *mcache	racectx     uintptr	deferpool    [5][]*_defer // pool of available defer structs of different sizes (see panic.go)	deferpoolbuf [5][32]*_defer	// Cache of goroutine ids, amortizes accesses to runtime·sched.goidgen.	goidcache    uint64	goidcacheend uint64	// Queue of runnable goroutines. Accessed without lock.	runqhead uint32	runqtail uint32	runq     [256]guintptr	// runnext, if non-nil, is a runnable G that was ready'd by	// the current G and should be run next instead of what's in	// runq if there's time remaining in the running G's time	// slice. It will inherit the time left in the current time	// slice. If a set of goroutines is locked in a	// communicate-and-wait pattern, this schedules that set as a	// unit and eliminates the (potentially large) scheduling	// latency that otherwise arises from adding the ready'd	// goroutines to the end of the run queue.	runnext guintptr	// Available G's (status == Gdead)	gfree    *g	gfreecnt int32	sudogcache []*sudog	sudogbuf   [128]*sudog	tracebuf traceBufPtr	// traceSweep indicates the sweep events should be traced.	// This is used to defer the sweep start event until a span	// has actually been swept.	traceSweep bool	// traceSwept and traceReclaimed track the number of bytes	// swept and reclaimed by sweeping in the current sweep loop.	traceSwept, traceReclaimed uintptr	palloc persistentAlloc // per-P to avoid mutex	// Per-P GC state	gcAssistTime     int64 // Nanoseconds in assistAlloc	gcBgMarkWorker   guintptr	gcMarkWorkerMode gcMarkWorkerMode	// gcw is this P's GC work buffer cache. The work buffer is	// filled by write barriers, drained by mutator assists, and	// disposed on certain GC state transitions.	gcw gcWork	runSafePointFn uint32 // if 1, run sched.safePointFn at next safe point	pad [sys.CacheLineSize]byte}```

> [Goroutines vs Threads](https://tech.ssut.me/goroutine-vs-threads/)




